package com.opesoft.fw.mvc.taglib;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import org.apache.commons.beanutils.BeanUtils;

import com.opesoft.fw.core.Constants;
import com.opesoft.fw.core.utils.WebUtils;
import com.opesoft.fw.mvc.Token;
import com.opesoft.fw.mvc.impl.StandardToken;

public class Form extends FormBase
{
	protected String name; // Form的名称，同时对应了存放数据的Bean的名称
	protected String action;
	protected String method;
	protected String scope; // 查找FormBean的范围
	protected String other;
	protected String validate; // 是否使用了架构中的验证机制
	protected String token; // 是否使用了架构中的令牌机制

	public String validateState; // 存放是否通过了验证的状态
	public Object attribute; // 存放Form中数据的变量

	public int doStartTag() throws JspException
	{
		if("true".equalsIgnoreCase(this.validate)) this.validateState=pageContext.getRequest().getAttribute(Constants.VALIDATE_STATE)+"";

		// 初始化存放数据的变量
		if(!"false".equalsIgnoreCase(this.validateState)) this.attribute=WebUtils.findAttribute(pageContext,name,scope);

		// 显示<Form/>开始表单
		String html="<form";
		if(name!=null) html+=" name=\""+name+"\"";
		if(action!=null) html+=" action=\""+WebUtils.addContextPath(pageContext,action)+"\"";
		if(method!=null) html+=" method=\""+method.toUpperCase()+"\"";
		if(other!=null) html+=" "+other;
		html+=">";

		// 使用令牌，通过Session中的Token创建出一个新的令牌
		if("true".equals(this.token))
		{
			Token token;

			Object obj=this.pageContext.getSession().getAttribute(Constants.MVC_SESSION_TOKENS);
			if(obj!=null)
			{
				token=(Token)obj;
			}
			else
			{
				token=new StandardToken();
				this.pageContext.getSession().setAttribute(Constants.MVC_SESSION_TOKENS,token);
			}
			html+="\n<input type=\"hidden\" name=\""+Constants.MVC_TOKEN+"\" value=\""+token.create()+"\">";
		}

		this.write(html);

		return Tag.EVAL_BODY_INCLUDE;
	}

	public int doEndTag() throws JspException
	{

		this.write("</form>");

		// 取消验证失败的状态
		// if("false".equalsIgnoreCase(this.validateState)) pageContext.getRequest().removeAttribute(Constant.VALIDATE_STATE);

		this.validateState=null;
		this.attribute=null;
		this.scope=null;
		this.other=null;
		this.token=null;
		this.method=null;
		return Tag.EVAL_PAGE;
	}

	/**
	 * 取得存放Form值变量中一个Property的值
	 * 
	 * @param name
	 * @return
	 */
	public String getPropertyValue(String name)
	{
		if("false".equalsIgnoreCase(this.validateState)) return pageContext.getRequest().getParameter(name);
		else if(this.attribute!=null)
		{
			try
			{
				return BeanUtils.getProperty(this.attribute,name);
			}
			catch(Exception e)
			{
				e.printStackTrace();
				return "";
			}
		}
		else return null;
	}

	/**
	 * 以数组方式取得存放Form值变量中一个Property的值
	 * 
	 * @param nam
	 * @return
	 */
	public String[] getArrayPropertyValue(String name)
	{
		if("false".equalsIgnoreCase(this.validateState)) return pageContext.getRequest().getParameterValues(name);
		else if(this.attribute!=null)
		{
			try
			{
				return BeanUtils.getArrayProperty(this.attribute,name);
			}
			catch(Exception e)
			{
				e.printStackTrace();
				return new String[0];
			}
		}
		else return null;
	}

	public String getAction()
	{
		return action;
	}

	public void setAction(String action)
	{
		this.action=action;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name=name;
	}

	public String getOther()
	{
		return other;
	}

	public void setOther(String other)
	{
		this.other=other;
	}

	public String getScope()
	{
		return scope;
	}

	public void setScope(String type)
	{
		this.scope=type;
	}

	public String getValidate()
	{
		return validate;
	}

	public void setValidate(String validate)
	{
		this.validate=validate;
	}

	public String getToken()
	{
		return token;
	}

	public void setToken(String token)
	{
		this.token=token;
	}

	public String getMethod()
	{
		return method;
	}

	public void setMethod(String method)
	{
		this.method=method;
	}
}
